/*
    类型定义
*/

#pragma once

#include <string>

namespace JsonMuduoRPC
{
#define KEY_METHOD "method"
#define KEY_PARAMS "params"
#define KEY_TOPIC_KEY "topic_key"
#define KEY_TOPIC_MSG "topic_msg"
#define KEY_OPTYPE "optype"
#define KEY_HOST "host"
#define KEY_HOST_IP "ip"
#define KEY_HOST_PORT "port"

#define KEY_RCODE "rcode"
#define KEY_RESULT "result"

    // 消息类型
    enum class MType
    {
        REQ_RPC = 0,
        RSP_RPC,
        REQ_TOPIC,
        RSP_TOPIC,
        REQ_SERVICE,
        RSP_SERVICE
    };

    // 响应码
    enum class RCode
    {
        RCODE_OK = 0,
        RCODE_PARSE_FAILED,
        RCODE_INVALID_MSG,
        RCODE_DISCONNECTED,
        RCODE_INVALID_PARAMS,
        RCODE_NOT_FOUND_SERVICE,
        RCODE_INVALID_OPTYPE,
        RCODE_NOT_FOUND_TOPIC,
        RCODE_INTERNAL_ERROR
    };

    // 返回响应码描述
    const std::string errReason(RCode code)
    {
        switch (code)
        {
        case RCode::RCODE_OK:
            return "成功处理！";
        case RCode::RCODE_PARSE_FAILED:
            return "消息解析失败！";
        case RCode::RCODE_INVALID_MSG:
            return "无效消息！";
        case RCode::RCODE_DISCONNECTED:
            return "连接已断开！";
        case RCode::RCODE_INVALID_PARAMS:
            return "无效的RPC参数！";
        case RCode::RCODE_NOT_FOUND_SERVICE:
            return "没找到对应的服务！";
        case RCode::RCODE_INVALID_OPTYPE:
            return "无效的操作类型！";
        case RCode::RCODE_NOT_FOUND_TOPIC:
            return "没有找到对应的主题！";
        default:
            return "未知错误！";
        }
    }

    // 发送请求的方式
    enum class RType
    {
        REQ_ASYNC = 0,
        REQ_CALLBACK
    };

    // RPC请求类型
    enum class RPCRequestType
    {
        REQ_SYNC = 0, // 同步
        REQ_ASYNC,    // 异步
        REQ_CALLBACK  // 回调
    };

    // 主题操作类型
    enum class TopicOpType
    {
        TOPIC_CREATE = 0, // 主题创建
        TOPIC_REMOVE,     // 主题删除
        TOPIC_SUBSCRIBE,  // 主题订阅
        TOPIC_CANCEL,     // 主题取消订阅
        TOPIC_PUBLISH     // 发布消息
    };

    // 服务操作类型
    enum class ServiceOpType
    {
        SERVICE_REGISTRY = 0, // 服务注册
        SERVICE_DISCOVERY,    // 服务发现
        SERVICE_ONLINE,       // 服务上线
        SERVICE_OFFLINE,      // 服务下线
        SERVICE_UNKNOW        // 未知服务
    };
} // namespace JsonMuduoRPC
